package Blog01;

//请实现笔记本电脑使用USB鼠标、USB键盘的例子
//        1. USB接口：包含打开设备、关闭设备功能
//        2. 笔记本类：包含开机功能、关机功能、使用USB设备功能
//        3. 鼠标类：实现USB接口，并具备点击功能
//        4. 键盘类：实现USB接口，并具备输入功能


//USB接口
public interface USB {
    //方法，打开设备，关闭设备
    void openEquipment();
    void stopEquipment();
}

//定义鼠标类，使用接口
class Mouse implements USB {

    //使用接口，就要重写USB接口的抽象方法
    @Override
    public void openEquipment() {
        System.out.println("使用鼠标");
    }

    //自定义一个鼠标点击的功能
    public void click(){
        System.out.println("鼠标点击");
    }

    @Override
    public void stopEquipment() {
        System.out.println("关闭鼠标");
    }
}

//定义键盘类，使用接口
class Keyboard implements USB{

    @Override
    public void openEquipment() {
        System.out.println("使用键盘");
    }

    //自定义一个键盘输入的方法
    public void inPut() {
        System.out.println("键盘输入");
    }

    @Override
    public void stopEquipment() {
        System.out.println("关闭键盘");
    }
}
//定义电脑类,使用设备
class Computer{
        public void powerOn(){
            System.out.println("打开电源");
        }

        public void useEquipment(USB usb){
            //这里使用USB usb的原因是：为了传参并发生向上转型

            usb.openEquipment();//这里会发生动态绑定

            //这里，我们调用了使用设备的方法，但我们有鼠标和键盘，他们都要各自特有的方法click和inPut
            //但usb是接口类型，直接用usb去调用他们的特有方法，不可行

            //区分 引用的是谁的对象
            if(usb instanceof Mouse){
                Mouse mouse = (Mouse) usb;
                mouse.click();
            }else if(usb instanceof Keyboard){
                Keyboard keyboard = (Keyboard) usb;
                keyboard.inPut();
            }

            usb.stopEquipment();

        }

        public void powerOff(){
            System.out.println("关闭电源");
        }

}

class Test{
    public static void main(String[] args) {
        Computer computer = new Computer();
        computer.powerOn();
        System.out.println();
        computer.useEquipment(new Keyboard());
        System.out.println();
        computer.useEquipment(new Mouse());
        System.out.println();
        computer.powerOff();

    }
}
